// index.js 封装require函数
const fs = require("fs");
const path = require("path");

_require.cache = {};
function _require(file) {
    // 1. 将相对路径转为绝对路径，定位目标文件；
    let absolutePath = path.resolve(__dirname, file);
    // 2. 缓存检测；
    if (this.cache[absolutePath]) {
        return this.cache[absolutePath]; // 被加载过一次，就不再往下执行
    };
    // 3. 读取目标文件代码；
    let fileCode = fs.readFileSync(absolutePath).toString();
    let module1 = {};
    let exports = module1.exports = {};
    // 4. 包裹一个函数并执行（自执行函数），这里就是模块封装器；
    (function (exports, require, module, __filename, __dirname) {
        // eval(fileCode); // 因为fileCode是被读取的字符串，所以使用eval()加载
        console.log(1111)
        module.exports = {name:"eee"}
    })(exports, _require, module1, __filename, __dirname);
    // 5. 缓存模块的值；
    this.cache[absolutePath] = module1.exports;
    // 6. 返回 `module.exports` 的值。
    console.log('module.exports',module1)
    return module1.exports;
}

 // 第一次模块加载时导出的内容被缓存在_require.cache对象中，所以再次导入a.js文件时代码不会被执行，也就不会打印内容了
// _require.call(_require, "./a.js"); // 打印：我是a.js文件
// _require.call(_require, "./a.js"); // a.js文件代码不会执行
// _require.call(_require, "./a.js"); // a.js文件代码不会执行
// _require.call(_require, "./a.js"); // a.js文件代码不会执行

// let test = _require.call(_require, "./a.js"); // a.js文件代码不会执行

let test = _require.call(_require, "./a.js");
console.log(test)

